package org.uca.dss.curso1011.grupo9;

import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.uca.dss.curso1011.grupo9.interfazExtendido.InformacionTrayecto;
import org.uca.dss.curso1011.grupo9.interfazExtendido.Itinerario;
import org.uca.dss.curso1011.grupo9.interfazExtendido.ReservaTrayecto;

/**
 * Implementación de las interfaces InterfazCompras de la interfaz normal y la extendida
 * Delega en operaciones del gestor de reservas y gestor de viajes
 * @author eldruin
 */
public class Reservas implements org.uca.dss.curso1011.grupo9.interfaz.InterfazCompras, org.uca.dss.curso1011.grupo9.interfazExtendido.InterfazCompras {

    private GestorReservas gestor_reservas;
    private GestorViajes gestor_viajes;

    /**
     * Constructor
     * @param gestor_reservas
     * @param gestor_viajes
     */
    public Reservas(GestorReservas gestor_reservas, GestorViajes gestor_viajes)
    {
        this.gestor_reservas = gestor_reservas;
        this.gestor_viajes = gestor_viajes;
    }

    public static void init() throws Exception {
    }

    @Override
    public String reservaAsiento(String origen, String destino, LocalDate fecha, LocalTime hora) {
        Viaje v = gestor_viajes.buscarViaje(origen, destino, fecha, hora);

        if (v != null)
            return gestor_reservas.reservaAsiento(v, fecha);
        else
            return "-1"; 

    }

    @Override
    public int asientosLibres(String origen, String destino, LocalDate fecha, LocalTime hora) {
        Viaje v = gestor_viajes.buscarViaje(origen, destino, fecha, hora);


        return gestor_reservas.plazasLibres(v);
    }

    @Override
    public void cancelaReserva(String codigoReserva) {
        gestor_reservas.cancelaReserva(codigoReserva);
    }

    @Override
    public double getPrecio(String origen, String destino, LocalDate fecha, LocalTime hora) {
        Viaje v = gestor_viajes.buscarViaje(origen, destino, fecha, hora);

        if (v != null)
            return v.calcularPrecioViaje();
        else
            return 0;

    }

    @Override
    public List<ReservaTrayecto> reservaAsiento(Itinerario itinerario, LocalDate fecha)
    {
	List<ReservaTrayecto> resultado = new ArrayList<ReservaTrayecto>();

	for (InformacionTrayecto it : itinerario)
	{
            Viaje v = gestor_viajes.buscarViaje(it.getOrigen(),
                                                  it.getDestino(),
                                                  fecha,
					          it.getHoraSalida());
            if (v != null)
            {
                String codigo = gestor_reservas.reservaAsiento(v, fecha);
            
                List<ReservaTrayecto> rts = gestor_reservas.reservaComoLista(codigo);
            
                for (ReservaTrayecto rt : rts)
                    resultado.add(rt);
            }
	}

        return resultado;
    }

    @Override
    public int asientosLibres(LocalDate fecha, Itinerario itinerario) 
    {
        int min_asientos = Integer.MAX_VALUE;

        // Mínimo de todos los viajes

	for (InformacionTrayecto it : itinerario)
	{
            Viaje v = gestor_viajes.buscarViaje(it.getOrigen(),
                                            it.getDestino(),
                                            fecha,
                          	            it.getHoraSalida());
            if (v != null)
            {
                int plazas = gestor_reservas.plazasLibres(v);

                if (plazas < min_asientos)
                    min_asientos = plazas;
            }
	}

	return min_asientos;
    }

    @Override
    public void cancelaReserva(ReservaTrayecto reserva) {
        gestor_reservas.cancelaReserva(reserva.getCodigoReserva());
    }

    @Override
    public void cancelaReserva(List<ReservaTrayecto> reservas) {
        for (ReservaTrayecto rt : reservas)
            cancelaReserva(rt);
    }

}
